package com.hx.er.action.manager.user;

import java.util.Date;

import javax.servlet.http.Cookie;

import org.springframework.beans.factory.annotation.Autowired;

import com.hx.er.action.base.ErManagerAction;
import com.hx.er.bean.base.UserBean;
import com.hx.er.common.entity.LoginInfoEntity;
import com.hx.er.common.logic.SessionUtil;
import com.hx.er.common.logic.UserLoginInfoUtil;
import com.hx.er.common.system.Constants;
import com.hx.er.common.system.ErProperties;
import com.hx.er.common.system.ErSessions;
import com.hx.er.common.util.MD5Util;
import com.hx.er.common.util.StringUtil;
import com.hx.er.service.manager.IManagerUserService;
import com.opensymphony.xwork2.ActionContext;

/**
 * 用户登录、登出Action
 * 
 * @author HX
 * @version 1.0
 * @since 1.0
 */
public class ManagerLoginAction extends ErManagerAction {
	// 序列化ID
	private static final long serialVersionUID = 4926512300151605899L;
	
	// cookie保存时间
	private static final int cookieExpirationDate = Integer.parseInt(ErProperties.getProperty(Constants.PROPERTY_COOKIE_EXPIRATION_DATE));

	private UserBean userBeanPage;
	private boolean autoLogin;

	@Autowired
	private IManagerUserService managerUserService;

	public String init() {
		Cookie[] cookies = request.getCookies();
		this.userBeanPage = new UserBean();

		for (Cookie cookie : cookies) {
			if (StringUtil.isEqual(Constants.COOKIE_LOGIN_USERNAME, cookie.getName())) {
				this.userBeanPage.setUserName(cookie.getValue());
			} else if (StringUtil.isEqual(Constants.COOKIE_LOGIN_PASSWORD, cookie.getName())) {
				this.userBeanPage.setPassword(cookie.getValue());
			} else if (StringUtil.isEqual(Constants.COOKIE_LOGIN_AUTO, cookie.getName())) {
				this.autoLogin = StringUtil.isEqual(cookie.getValue(), Constants.BOOLEAN_STR_TRUE);
			}
		}

		// 判断是否自动登录
		if (this.autoLogin) {
			if (this.loginMethod()) {
				// 跳转到主页
				return HOME;
			} else {
				// 页面提示信息
				this.addFieldError("msg.input", "用户名或密码错误，请重新登录。");
				// 返回登录页面，带错误信息
				return LOGIN;
			}
		} else {
			// 返回登录页面
			return SUCCESS;
		}
	}

	public String login() {
		// 检查用户登录次数
		int currentCount = UserLoginInfoUtil.getUserLoginCount(this.userBeanPage.getUserName());
		// 获取配置量
		String limitCountStr = ErProperties.getProperty(Constants.PROPERTY_LIMIT_LOGIN_FAILURE_COUNT);
		// 极限次数
		int limitCount = Integer.parseInt(limitCountStr);
		// 判断登录失败次数是否超过限制
		if (currentCount >= limitCount) {
			this.addFieldError("msg.count", String.format("登录失败已经超过%s次。", limitCount));
			return LOGIN;
		}

		// 密码转换MD5
		this.userBeanPage.setPassword(MD5Util.encodeMD5(this.userBeanPage.getPassword()));

		// 调用登录方法
		if (this.loginMethod()) {
			// 记录登录成功数据
			LoginInfoEntity loginInfo = new LoginInfoEntity();
			loginInfo.setUserId(super.userInfoLogin.getUpdateUserId());
			loginInfo.setRestId(super.restId);
			loginInfo.setUserTypeId(Constants.USER_TYPE_MANAGER);
			loginInfo.setFailureCount(UserLoginInfoUtil.getUserLoginCount(super.userInfoLogin.getUserName()));
			loginInfo.setIpAddress(super.ipLong);
			loginInfo.setLoginDate(new Date(System.currentTimeMillis()));
			this.managerUserService.insertLoginInfoWithoutId(loginInfo);

			return SUCCESS;
		} else {
			// 页面提示信息
			this.addFieldError("msg.input", "用户名或密码错误，请重新登录。");
			// 失败次数记录
			int countNew = UserLoginInfoUtil.userLoginCount(this.userBeanPage.getUserName());
			// 提示登录失败
			this.addFieldError("msg.count", String.format("已登录失败%s次，最多%s次。", countNew, limitCount));

			return LOGIN;
		}
	}

	public String logout() {
		// 清除登录信息中的数据
		ErSessions.logout(super.request.getSession().getId());

		// 清空session中用户信息
		super.userInfoLogin = null;
		SessionUtil.removeAttribute(ActionContext.getContext(), Constants.SESSION_USER_INFO);

		// 清理cookie
		this.clearCookie();

		// 页面跳转
		return SUCCESS;
	}

	/**
	 * 公用的登录方法，用于手工登录或cookie自动登录
	 * 
	 * @return
	 */
	private boolean loginMethod() {
		// 设置当前访问用户的所属餐馆
		this.userBeanPage.setRestId(super.restId);

		// 获取用户输入的登录ID，这可能是邮箱、用户名或者手机号
		String value = this.userBeanPage.getUserName();
		if (StringUtil.isNumeric(value)) {
			this.userBeanPage.setMobile(value);
			this.userBeanPage.setUserName(null);
		} else if (StringUtil.isEmailAddr(value)) {
			this.userBeanPage.setMail(value);
			this.userBeanPage.setUserName(null);
		}

		// 设定用户类型
		this.userBeanPage.setUserTypeId(Constants.USER_TYPE_MANAGER);

		// 检索用户信息，并存入session，以后使用可以直接从session中取，即super.userInfoLogin
		super.userInfoLogin = this.managerUserService.getUserAlive(this.userBeanPage);

		if (super.userInfoLogin == null) {
			return false;
		} else {
			// session中增加用户信息
			SessionUtil.setAttributes(ActionContext.getContext(), Constants.SESSION_USER_INFO, super.userInfoLogin);
			// 将用户登录信息计入内存
			ErSessions.login(super.request.getSession().getId());
			// 判断是否计入cookie
			if (autoLogin) {
				this.setCookie(super.userInfoLogin.getUserName(), this.userBeanPage.getPassword());
			} else {
				this.clearCookie();
			}

			return true;
		}
	}

	private void setCookie(String userName, String password) {
		// 自动登录设置
		// 保存用户名到Cookie
		Cookie cookie = new Cookie(Constants.COOKIE_LOGIN_USERNAME, userName);
		cookie.setPath("/");
		cookie.setDomain(super.serverName);
		cookie.setMaxAge(3600 * 24 * cookieExpirationDate);
		super.response.addCookie(cookie);

		// 保存密码到Cookie，注意需要加密一下
		cookie = new Cookie(Constants.COOKIE_LOGIN_PASSWORD, password);
		cookie.setPath("/");
		cookie.setDomain(super.serverName);
		cookie.setMaxAge(3600 * 24 * cookieExpirationDate);
		super.response.addCookie(cookie);

		// 保存密码到Cookie，注意需要加密一下
		cookie = new Cookie(Constants.COOKIE_LOGIN_AUTO, this.autoLogin ? Constants.BOOLEAN_STR_TRUE : Constants.BOOLEAN_STR_FALSE);
		cookie.setPath("/");
		cookie.setDomain(super.serverName);
		cookie.setMaxAge(3600 * 24 * cookieExpirationDate);
		super.response.addCookie(cookie);
	}

	private void clearCookie() {
		// 保存用户名到Cookie
		Cookie cookie = new Cookie(Constants.COOKIE_LOGIN_USERNAME, StringUtil.EMPTY);
		cookie.setPath("/");
		cookie.setDomain(super.serverName);
		cookie.setMaxAge(99999999);
		super.response.addCookie(cookie);

		// 保存密码到Cookie，注意需要加密一下
		cookie = new Cookie(Constants.COOKIE_LOGIN_PASSWORD, StringUtil.EMPTY);
		cookie.setPath("/");
		cookie.setDomain(super.serverName);
		cookie.setMaxAge(3600 * 24 * cookieExpirationDate);
		super.response.addCookie(cookie);

		// 保存密码到Cookie，注意需要加密一下
		cookie = new Cookie(Constants.COOKIE_LOGIN_AUTO, StringUtil.EMPTY);
		cookie.setPath("/");
		cookie.setDomain(super.serverName);
		cookie.setMaxAge(3600 * 24 * cookieExpirationDate);
		super.response.addCookie(cookie);
	}

	public UserBean getUserBeanPage() {
		return userBeanPage;
	}

	public void setUserBeanPage(UserBean userBeanPage) {
		this.userBeanPage = userBeanPage;
	}

	public boolean isAutoLogin() {
		return autoLogin;
	}

	public void setAutoLogin(boolean autoLogin) {
		this.autoLogin = autoLogin;
	}
}
